Spring AI 中的 Advisor 到底是干什么的?
本文章内容基于SpringBoot 4.1.1 + Spring AI 2.0.1进行撰写。
最近在用 Spring AI 的 ChatClient 时,经常能看到这种写法:
chatClient.prompt()
.user(question)
.advisors(...)
.call();这里的 Advisor 一开始很容易让人迷惑:它到底负责什么?
可以简单理解成:Advisor 是挂在 ChatClient 调用链上的一层处理逻辑。
它可以在请求发给模型之前处理请求,也可以在模型返回之后处理响应。
常见用途主要有下面几种。
1. 对话记忆
LLM API 本身没有会话状态。
比如:
用户:我叫小黄下一次请求:
用户:我叫什么?如果只把第二句话发给模型,它并不知道前面发生过什么。
MessageChatMemoryAdvisor 会读取历史消息,再把历史消息和当前问题一起交给模型:
当前问题
+
历史消息
↓
Prompt
↓
ChatModel这样业务代码就不用每次自己处理:
chatMemory.get(...)然后再手动拼 Prompt。
2. RAG
RAG 也是 Advisor 很典型的使用场景。
例如:
QuestionAnswerAdvisor大致流程:
用户问题
↓
Advisor
↓
VectorStore.similaritySearch()
↓
相关文档
↓
加入 Prompt
↓
ChatModel业务代码可以直接写:
chatClient.prompt()
.user(question)
.advisors(questionAnswerAdvisor)
.call();而不用每次都自己写:
vectorStore.similaritySearch(...);
String context = ...;
systemPrompt += context;
chatClient.prompt()...Spring AI 里常见的 RAG Advisor 包括:
QuestionAnswerAdvisor
RetrievalAugmentationAdvisor3. 日志
比如:
SimpleLoggerAdvisor可以统一记录请求和响应信息,例如:
Prompt
模型参数
模型响应这样就不用在每个 chatClient.prompt() 外面重复写日志代码。
4. 安全检查
Advisor 也不一定非得调用模型。
例如:
SafeGuardAdvisor可以在模型调用之前检查用户输入:
用户问题
↓
安全检查
↓
不允许 ──→ 直接阻断
允许
↓
ChatModel所以 Advisor 不只是“增强 Prompt”。
它也可以修改请求、阻止请求,甚至直接抛异常。
5. Tool Calling
Tool Calling 也可以通过 Advisor 接管。
例如:
ToolCallingAdvisor
ToolSearchToolCallingAdvisor假设用户问:
现在杭州几点?调用过程可能是:
用户问题
↓
ToolCallingAdvisor
↓
模型决定调用 getCurrentTime
↓
执行工具
↓
ToolResult 加回对话
↓
再次调用模型
↓
最终回答也就是说,工具调用过程中那套:
模型 → Tool → 模型的循环,可以交给 Advisor 处理。
总结
所以在 Spring AI 里,可以把 Advisor 看成 ChatClient 调用链上的扩展点。
像下面这些能力:
对话记忆
RAG
日志
安全检查
Tool Calling都可以通过 Advisor 插入到模型调用过程中。
如果类比 Spring Web,感觉上有点像:
Interceptor / Filter只是它处理的对象不是 HTTP 请求,而是 AI 请求、Prompt、上下文和模型响应。
